/*
 * Projeto Destinado a Prefeitura de Goiânia.
 * Projeto de Modernização do Arquitetura de Desenvolvimento de Software.
 * Todos os Direitos Reservados.
 */
package br.com.prefeitura.goiania.orcamento.entidade;

import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

/**
 *
 * @author Germinado
 */
@Entity
@Table(name = "despesa")
@NamedQueries({
    @NamedQuery(name = "Despesa.listarTodos",                 query = "SELECT d FROM Despesa d"),
    @NamedQuery(name = "Despesa.obterPorId",                  query = "SELECT d FROM Despesa d WHERE d.pk.idDespesa = :idDespesa"),                 
    @NamedQuery(name = "Despesa.listarPorIdSitProcesso",      query = "SELECT d FROM Despesa d WHERE d.pk.idSitProcesso = :idSitProcesso"),           //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorIdTipoDespesa",      query = "SELECT d FROM Despesa d WHERE d.pk.idTipoDespesa = :idTipoDespesa"),           //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorIdDotcao",           query = "SELECT d FROM Despesa d WHERE d.pk.idDotcao = :idDotcao"),                     //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorIdFonte",            query = "SELECT d FROM Despesa d WHERE d.pk.idFonte = :idFonte"),                       //TODO: E lista ou unico?   
    @NamedQuery(name = "Despesa.listarPorIdAno",              query = "SELECT d FROM Despesa d WHERE d.pk.idAno = :idAno"),                           //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorIdProgOrcamentaria", query = "SELECT d FROM Despesa d WHERE d.pk.idProgOrcamentaria = :idProgOrcamentaria"), //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorValorJan",           query = "SELECT d FROM Despesa d WHERE d.valorJan = :valorJan"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?    
    @NamedQuery(name = "Despesa.listarPorValorFev",           query = "SELECT d FROM Despesa d WHERE d.valorFev = :valorFev"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorMar",           query = "SELECT d FROM Despesa d WHERE d.valorMar = :valorMar"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorAbr",           query = "SELECT d FROM Despesa d WHERE d.valorAbr = :valorAbr"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorMai",           query = "SELECT d FROM Despesa d WHERE d.valorMai = :valorMai"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorJun",           query = "SELECT d FROM Despesa d WHERE d.valorJun = :valorJun"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorJul",           query = "SELECT d FROM Despesa d WHERE d.valorJul = :valorJul"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorAgo",           query = "SELECT d FROM Despesa d WHERE d.valorAgo = :valorAgo"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorSet",           query = "SELECT d FROM Despesa d WHERE d.valorSet = :valorSet"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorOut",           query = "SELECT d FROM Despesa d WHERE d.valorOut = :valorOut"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorNov",           query = "SELECT d FROM Despesa d WHERE d.valorNov = :valorNov"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorValorDez",           query = "SELECT d FROM Despesa d WHERE d.valorDez = :valorDez"), //TODO:Faz Sentido buscar por valor do mes nao seria o caso so uma fazer uma passando o mes e o valor desejado?
    @NamedQuery(name = "Despesa.listarPorNumProcesso",        query = "SELECT d FROM Despesa d WHERE d.numProcesso = :numProcesso"), //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorNumContrato",        query = "SELECT d FROM Despesa d WHERE d.numContrato = :numContrato"), //TODO: E lista ou unico?
    @NamedQuery(name = "Despesa.listarPorObservacao",         query = "SELECT d FROM Despesa d WHERE d.observacao = :observacao")})
public class Despesa implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @EmbeddedId
    protected DespesaPK pk;   //TODO: Trabalhar com chave multipla e canceira em Hibernate sugestao cria um ID pra despesa e usa os relacionamentos como UK no banco sacoh
                                     //Faz tanto sentido isso q to dizendo q observe q vc guarda a chave do elemento na PK e logo em seguida repete o objeto na mesma tupla ou seja 
                                     //vai guardar o código duas vezes.
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_jan")
    private BigDecimal valorJan;    
    
    // @Max(value=?)  @Min(value=?)
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_fev")
    private BigDecimal valorFev;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_mar")
    private BigDecimal valorMar;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_abr")
    private BigDecimal valorAbr;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_mai")
    private BigDecimal valorMai;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_jun")
    private BigDecimal valorJun;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_jul")
    private BigDecimal valorJul;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_ago")
    private BigDecimal valorAgo;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_set")
    private BigDecimal valorSet;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_out")
    private BigDecimal valorOut;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_nov")
    private BigDecimal valorNov;
    
    @Basic(optional = false)
    @NotNull
    @Column(name = "valor_dez")
    private BigDecimal valorDez;
    @Basic(optional = false)
    
    @NotNull
    @Size(min = 1, max = 2147483647)
    @Column(name = "num_processo")
    private String numProcesso;
    
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2147483647)
    @Column(name = "num_contrato")
    private String numContrato;
    
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2147483647)
    @Column(name = "observacao")
    private String observacao;
    
    @JoinColumn(name = "id_tipo_despesa", referencedColumnName = "id_tipo_despesa", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private TipoDespesa tipoDespesa;
    
    @JoinColumn(name = "id_sit_processo", referencedColumnName = "id_sit_processo", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private SituacaoProcesso situacaoProcesso;
    
    @JoinColumn(name = "id_prog_orcamentaria", referencedColumnName = "id_prog_orcamentaria", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private ProgOrcamentaria progOrcamentaria;
    
    @JoinColumn(name = "id_fonte", referencedColumnName = "id_fonte", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Fonte fonte;
    
    @JoinColumn(name = "id_dotcao", referencedColumnName = "id_dotcao", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private DotacaoOrcamentaria dotacaoOrcamentaria;
    
    @JoinColumn(name = "id_ano", referencedColumnName = "id_ano", insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private Ano ano;
    
    public DespesaPK getPK() {
        return pk;
    }

    public void setPK(final DespesaPK pk) {
        this.pk = pk;
    }
    
    public BigDecimal getValorJan() {
        return valorJan;
    }

    public void setValorJan(final BigDecimal valor) {
        this.valorJan = valor;
    }    

    public BigDecimal getValorFev() {
        return valorFev;
    }

    public void setValorFev(final BigDecimal valor) {
        this.valorFev = valor;
    }

    public BigDecimal getValorMar() {
        return valorMar;
    }

    public void setValorMar(final BigDecimal valor) {
        this.valorMar = valor;
    }

    public BigDecimal getValorAbr() {
        return valorAbr;
    }

    public void setValorAbr(final BigDecimal valor) {
        this.valorAbr = valor;
    }

    public BigDecimal getValorMai() {
        return valorMai;
    }

    public void setValorMai(final BigDecimal valor) {
        this.valorMai = valor;
    }

    public BigDecimal getValorJun() {
        return valorJun;
    }

    public void setValorJun(final BigDecimal valor) {
        this.valorJun = valor;
    }

    public BigDecimal getValorJul() {
        return valorJul;
    }

    public void setValorJul(final BigDecimal valor) {
        this.valorJul = valor;
    }

    public BigDecimal getValorAgo() {
        return valorAgo;
    }

    public void setValorAgo(final BigDecimal valor) {
        this.valorAgo = valor;
    }

    public BigDecimal getValorSet() {
        return valorSet;
    }

    public void setValorSet(final BigDecimal valor) {
        this.valorSet = valor;
    }

    public BigDecimal getValorOut() {
        return valorOut;
    }

    public void setValorOut(final BigDecimal valor) {
        this.valorOut = valor;
    }

    public BigDecimal getValorNov() {
        return valorNov;
    }

    public void setValorNov(final BigDecimal valor) {
        this.valorNov = valor;
    }

    public BigDecimal getValorDez() {
        return valorDez;
    }

    public void setValorDez(final BigDecimal valor) {
        this.valorDez = valor;
    }

    public String getNumProcesso() {
        return numProcesso;
    }

    public void setNumProcesso(final String numero) {
        this.numProcesso = numero;
    }

    public String getNumContrato() {
        return numContrato;
    }

    public void setNumContrato(final String numero) {
        this.numContrato = numero;
    }

    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(final String observacao) {
        this.observacao = observacao;
    }

    public TipoDespesa getTipoDespesa() {
        return tipoDespesa;
    }

    public void setTipoDespesa(final TipoDespesa tipo) {
        this.tipoDespesa = tipo;
    }

    public SituacaoProcesso getSituacaoProcesso() {
        return situacaoProcesso;
    }

    public void setSituacaoProcesso(final SituacaoProcesso situacao) {
        this.situacaoProcesso = situacao;
    }

    public ProgOrcamentaria getProgOrcamentaria() {
        return progOrcamentaria;
    }

    public void setProgOrcamentaria(final ProgOrcamentaria programa) {
        this.progOrcamentaria = programa;
    }

    public Fonte getFonte() {
        return fonte;
    }

    public void setFonte(final Fonte fonte) {
        this.fonte = fonte;
    }

    public DotacaoOrcamentaria getDotacaoOrcamentaria() {
        return dotacaoOrcamentaria;
    }

    public void setDotacaoOrcamentaria(final DotacaoOrcamentaria dotacao) {
        this.dotacaoOrcamentaria = dotacao;
    }

    public Ano getAno() {
        return ano;
    }

    public void setAno(final Ano ano) {
        this.ano = ano;
    }
    
}